package string;
/**
 *    String字符串类：
 *    1.java会将所有使用字面量（直接量）（双引号内的内容）形式创建的字符串对象缓存在常量池中
 *    2.new String()创建是，一定会创建新对象
 *    3.String 是不变对象，创建后内容不可改变，改变则创建新对象
 *    4.若想比较字符串内容相同，需要使用equals()方法
 */
public class StringDemo {
    public static void main(String[] args) {
        String s1 = "123abc";  //字面量创建的字符串第一次使用时会缓存在常量池中
        String s2 = "123abc";  //重用s1对象（复用常量池中“123abc”对象）
        String s3 = "123abc";  //依然重用
        String s4 = new String("123abc");  //new则一定创建新对象，不推荐这样的方式来创建字符串对象
        System.out.println(s1 == s2);  //true,s1和s2为引用类型变量，保存的是地址，此时地址相同
        System.out.println(s1 == s3);  //true
        System.out.println(s1 == s4);  //false


        String s = "123";
        String s5 = s + "abc";  //字符串是不变对象，拼接字符串会产生新对象，s5指向新对象--------变量与字面量连接，不会触发预计算特性
        System.out.println(s5 == s1);  //false ，没有重复常量池对象

        String s6 = "123" + "abc";  //两个字面量连接时，会触发预计算特性，直接编译为String s6 = "123abc"，复用该对象
        System.out.println(s6 == s1);  //true

        /*
           ==是比较值是否相等，对于引用类型而言，引用中保存的是地址，
          所以==比较的是地址，地址相同意味着两个引用指向了同一个对象，
          对于字符串而言，实际应用中我们通常希望比较的是两个字符串的内容是否相同，
          因此一般都是通过equals()来比较字符串内容是否相同的
         */
        String s7 = "123abc";
        String s8 = new String("123abc");
        System.out.println(s7 == s8);  //false， ==是比较地址，因为地址不同，所以为false
        System.out.println(s7.equals(s8));  //true, equals()是比较内容相同
    }
}
